

function Bus(){
    // 通过 this 绑定实例变量
    this.events={
    };
}

Bus.prototype.on = function( type , handler ){
    // 从 events 对象中尝试获取 type 事件对应的监听器数组
    let arr = this.events[ type ];
    // 若能够得到监听器数组
    if( arr ) {
        // 则将新的监听器添加到数组中
        arr.push( handler );
        return;
    }
    // 若不能得到监听器数组，则添加 type 对应的监听器数组
    this.events[ type ] = [ handler ];
}

Bus.prototype.emit = function( type , ...params ) {
    // 从 events 对象中尝试获取 type 事件对应的监听器数组
    let arr = this.events[ type ];
    if( arr ) {
        arr.forEach( h => h.call( this , ...params ) );
    }
}

Bus.prototype.off = function( type , handler ) {
    // 从 events 对象中尝试获取 type 事件对应的监听器数组
    let arr = this.events[ type ];
    if( arr ) {
        // 如果只有一个监听器并且该监听器就是需要删除的监听器
        if( arr.length === 1 && arr[0] === handler ) {
            delete this.events[ type ];
            return;
        }
        let index = arr.findIndex( h => h === handler );
        if( index != -1 ) {
            arr.splice( index , 1 );
        }
    }
}